﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Series.Bar
{
	public class Bar
	{

		public String type { get; set; } = "bar";

		/// <summary>
		/// string
		/// 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
		/// </summary>
		public String id { get; set; }

		/// <summary>
		/// string
		/// 系列名称，用于tooltip的显示，legend 的图例筛选，在 setOption 更新数据和配置项时用于指定对应的系列。
		/// </summary>
		public String name { get; set; }

		/// <summary>
		/// boolean
		/// 是否启用图例 hover 时的联动高亮。
		/// </summary>
		public Boolean legendHoverLink { get; set; } = true;

		/// <summary>
		/// string
		/// 该系列使用的坐标系，可选：
		/// 'cartesian2d'
		///   使用二维的直角坐标系（也称笛卡尔坐标系），通过 xAxisIndex, yAxisIndex指定相应的坐标轴组件。
		/// </summary>
		public String coordinateSystem { get; set; } = "cartesian2d";

		/// <summary>
		/// number
		/// 使用的 x 轴的 index，在单个图表实例中存在多个 x 轴的时候有用。
		/// </summary>
		public int xAxisIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的 y 轴的 index，在单个图表实例中存在多个 y轴的时候有用。
		/// </summary>
		public int yAxisIndex { get; set; } = 0;

		/// <summary>
		/// boolean
		/// 是否在环形柱条两侧使用圆弧效果。
		/// 仅对极坐标系柱状图有效。
		/// </summary>
		public Boolean roundCap { get; set; } = false;

		/// <summary>
		/// Object
		/// 图形上的文本标签，可用于说明图形的一些数据信息，比如值，名称等，label选项在 ECharts 2.x 中放置于itemStyle下，在 ECharts 3 中为了让整个配置项结构更扁平合理，label 被拿出来跟 itemStyle 平级，并且跟 itemStyle 一样拥有 emphasis 状态。
		/// </summary>
		public WUDI.ECharts.Series.Bar.Label.Label label { get; set; }

		/// <summary>
		/// Object
		/// 图形样式。
		/// </summary>
		public WUDI.ECharts.Series.Bar.ItemStyle.ItemStyle itemStyle { get; set; }

		/// <summary>
		/// Object
		/// 高亮的图形样式和标签样式。
		/// </summary>
		public WUDI.ECharts.Series.Bar.Emphasis.Emphasis emphasis { get; set; }

		/// <summary>
		/// string
		/// 数据堆叠，同个类目轴上系列配置相同的stack值可以堆叠放置。
		/// </summary>
		public String stack { get; set; }

		/// <summary>
		/// string
		/// 鼠标悬浮时在图形元素上时鼠标的样式是什么。同 CSS 的 cursor。
		/// </summary>
		public String cursor { get; set; } = "pointer";

		/// <summary>
		/// number,string
		/// 柱条的宽度，不设时自适应。
		/// 可以是绝对值例如 40 或者百分数例如 '60%'。百分数基于自动计算出的每一类目的宽度。
		/// 在同一坐标系上，此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效，并且是对此坐标系中所有 'bar' 系列生效。
		/// </summary>
		public dynamic barWidth { get; set; } = "自适应";

		/// <summary>
		/// number,string
		/// 柱条的最大宽度。
		/// 比 barWidth 优先级高。
		/// 可以是绝对值例如 40 或者百分数例如 '60%'。百分数基于自动计算出的每一类目的宽度。
		/// 在同一坐标系上，此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效，并且是对此坐标系中所有 'bar' 系列生效。
		/// </summary>
		public dynamic barMaxWidth { get; set; }

		/// <summary>
		/// number,string
		/// 柱条的最小宽度。在直角坐标系中，默认值是 1。否则默认值是 null。
		/// 比 barWidth 优先级高。
		/// 可以是绝对值例如 40 或者百分数例如 '60%'。百分数基于自动计算出的每一类目的宽度。
		/// 在同一坐标系上，此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效，并且是对此坐标系中所有 'bar' 系列生效。
		/// </summary>
		public dynamic barMinWidth { get; set; }

		/// <summary>
		/// number
		/// 柱条最小高度，可用于防止某数据项的值过小而影响交互。
		/// </summary>
		public int barMinHeight { get; set; } = 0;

		/// <summary>
		/// string
		/// 不同系列的柱间距离，为百分比（如 '30%'，表示柱子宽度的 30%）。
		/// 如果想要两个系列的柱子重叠，可以设置 barGap 为 '-100%'。这在用柱子做背景的时候有用。
		/// 在同一坐标系上，此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效，并且是对此坐标系中所有 'bar' 系列生效。
		/// 例子：
		/// </summary>
		public String barGap { get; set; } = "30%";

		/// <summary>
		/// string
		/// 同一系列的柱间距离，默认为类目间距的20%，可设固定值
		/// 在同一坐标系上，此属性会被多个 'bar' 系列共享。此属性应设置于此坐标系中最后一个 'bar' 系列上才会生效，并且是对此坐标系中所有 'bar' 系列生效。
		/// </summary>
		public String barCategoryGap { get; set; } = "20%";

		/// <summary>
		/// boolean
		/// 是否开启大数据量优化，在数据图形特别多而出现卡顿时候可以开启。
		/// 开启后配合 largeThreshold 在数据量大于指定阈值的时候对绘制进行优化。
		/// 缺点：优化后不能自定义设置单个数据项的样式。
		/// </summary>
		public Boolean large { get; set; } = false;

		/// <summary>
		/// number
		/// 开启绘制优化的阈值。
		/// </summary>
		public int largeThreshold { get; set; } = 400;

		/// <summary>
		/// number
		/// 渐进式渲染时每一帧绘制图形数量，设为 0 时不启用渐进式渲染，支持每个系列单独配置。
		/// 在图中有数千到几千万图形元素的时候，一下子把图形绘制出来，或者交互重绘的时候可能会造成界面的卡顿甚至假死。ECharts 4 开始全流程支持渐进渲染（progressive rendering），渲染的时候会把创建好的图形分到数帧中渲染，每一帧渲染只渲染指定数量的图形。
		/// 该配置项就是用于配置该系列每一帧渲染的图形数，可以根据图表图形复杂度的需要适当调整这个数字使得在不影响交互流畅性的前提下达到绘制速度的最大化。比如在 lines 图或者平行坐标中线宽大于 1 的 polyline 绘制会很慢，这个数字就可以设置小一点，而线宽小于等于 1 的 polyline 绘制非常快，该配置项就可以相对调得比较大。
		/// </summary>
		public int progressive { get; set; } = 5000;

		/// <summary>
		/// number
		/// 启用渐进式渲染的图形数量阈值，在单个系列的图形数量超过该阈值时启用渐进式渲染。
		/// </summary>
		public int progressiveThreshold { get; set; } = 3000;

		/// <summary>
		/// string
		/// 分片的方式。可选值：
		/// 'sequential': 按照数据的顺序分片。缺点是渲染过程不自然。
		/// 'mod': 取模分片，即每个片段中的点会遍布于整个数据，从而能够视觉上均匀得渲染。
		/// </summary>
		public BarProgressiveChunkMode progressiveChunkMode { get; set; } = BarProgressiveChunkMode.mod;

		/// <summary>
		/// Array
		/// </summary>
		public List<object> dimensions { get; set; }

		/// <summary>
		/// Object
		/// 可以定义 data 的哪个维度被编码成什么。比如：
		/// option = {
		///     dataset: {
		///         source: [
		///             // 每一列称为一个『维度』。
		///             // 这里分别是维度 0、1、2、3、4。
		///             [12, 44, 55, 66, 2],
		///             [23, 6, 16, 23, 1],
		///             ...
		///         ]
		///     },
		///     series: {
		///         type: 'xxx',
		///         encode: {
		///             x: [3, 1, 5],      // 表示维度 3、1、5 映射到 x 轴。
		///             y: 2,              // 表示维度 2 映射到 y 轴。
		///             tooltip: [3, 2, 4] // 表示维度 3、2、4 会在 tooltip 中显示。
		///         }
		///     }
		/// }
		/// 当使用 dimensions 给维度定义名称后，encode 中可直接引用名称，例如：
		/// series: {
		///     type: 'xxx',
		///     dimensions: ['date', 'open', 'close', 'highest', 'lowest'],
		///     encode: {
		///         x: 'date',
		///         y: ['open', 'close', 'highest', 'lowest']
		///     }
		/// }
		/// encode 声明的基本结构如下，其中冒号左边是坐标系、标签等特定名称，如 'x', 'y', 'tooltip' 等，冒号右边是数据中的维度名（string 格式）或者维度的序号（number 格式，从 0 开始计数），可以指定一个或多个维度（使用数组）。通常情况下，下面各种信息不需要所有的都写，按需写即可。
		/// 下面是 encode 支持的属性：
		/// // 在任何坐标系和系列中，都支持：
		/// encode: {
		///     // 使用 “名为 product 的维度” 和 “名为 score 的维度” 的值在 tooltip 中显示
		///     tooltip: ['product', 'score']
		///     // 使用 “维度 1” 和 “维度 3” 的维度名连起来作为系列名。（有时候名字比较长，这可以避免在 series.name 重复输入这些名字）
		///     seriesName: [1, 3],
		///     // 表示使用 “维度2” 中的值作为 id。这在使用 setOption 动态更新数据时有用处，可以使新老数据用 id 对应起来，从而能够产生合适的数据更新动画。
		///     itemId: 2,
		///     // 指定数据项的名称使用 “维度3” 在饼图等图表中有用，可以使这个名字显示在图例（legend）中。
		///     itemName: 3
		/// }
		/// // 直角坐标系（grid/cartesian）特有的属性：
		/// encode: {
		///     // 把 “维度1”、“维度5”、“名为 score 的维度” 映射到 X 轴：
		///     x: [1, 5, 'score'],
		///     // 把“维度0”映射到 Y 轴。
		///     y: 0
		/// }
		/// // 单轴（singleAxis）特有的属性：
		/// encode: {
		///     single: 3
		/// }
		/// // 极坐标系（polar）特有的属性：
		/// encode: {
		///     radius: 3,
		///     angle: 2
		/// }
		/// // 地理坐标系（geo）特有的属性：
		/// encode: {
		///     lng: 3,
		///     lat: 2
		/// }
		/// // 对于一些没有坐标系的图表，例如饼图、漏斗图等，可以是：
		/// encode: {
		///     value: 3
		/// }
		/// 这是个更丰富的 encode 的示例：
		/// 特殊地，在 自定义系列（custom series） 中，encode 中轴可以不指定或设置为 null/undefined，从而使系列免于受这个轴控制，也就是说，轴的范围（extent）不会受此系列数值的影响，轴被 dataZoom 控制时也不会过滤掉这个系列：
		/// var option = {
		///     xAxis: {},
		///     yAxis: {},
		///     dataZoom: [{
		///         xAxisIndex: 0
		///     }, {
		///         yAxisIndex: 0
		///     }],
		///     series: {
		///         type: 'custom',
		///         renderItem: function (params, api) {
		///             return {
		///                 type: 'circle',
		///                 shape: {
		///                     cx: 100, // x 位置永远为 100
		///                     cy: api.coord([0, api.value(0)])[1],
		///                     r: 30
		///                 },
		///                 style: {
		///                     fill: 'blue'
		///                 }
		///             };
		///         },
		///         encode: {
		///             // 这样这个系列就不会被 x 轴以及 x
		///             // 轴上的 dataZoom 控制了。
		///             x: -1,
		///             y: 1
		///         },
		///         data: [ ... ]
		///     }
		/// };
		/// </summary>
		public dynamic encode { get; set; }

		/// <summary>
		/// string
		/// 当使用 dataset 时，seriesLayoutBy 指定了 dataset 中用行还是列对应到系列上，也就是说，系列“排布”到 dataset 的行还是列上。可取值：
		/// 'column'：默认，dataset 的列对应于系列，从而 dataset 中每一列是一个维度（dimension）。
		/// 'row'：dataset 的行对应于系列，从而 dataset 中每一行是一个维度（dimension）。
		/// 参见这个 示例
		/// </summary>
		public String seriesLayoutBy { get; set; } = "column";

		/// <summary>
		/// number
		/// 如果 series.data 没有指定，并且 dataset 存在，那么就会使用 dataset。datasetIndex 指定本系列使用那个 dataset。
		/// </summary>
		public int datasetIndex { get; set; } = 0;

		/// <summary>
		/// Array
		/// </summary>
		public List<object> data { get; set; }

		/// <summary>
		/// Object
		/// 图表标注。
		/// </summary>
		public WUDI.ECharts.Series.Bar.MarkPoint.MarkPoint markPoint { get; set; }

		/// <summary>
		/// *
		/// 图表标线。
		/// </summary>
		public WUDI.ECharts.Series.Bar.MarkLine.MarkLine markLine { get; set; }

		/// <summary>
		/// Object
		/// 图表标域，常用于标记图表中某个范围的数据，例如标出某段时间投放了广告。
		/// </summary>
		public WUDI.ECharts.Series.Bar.MarkArea.MarkArea markArea { get; set; }

		/// <summary>
		/// boolean
		/// 从 4.4.0 开始支持
		/// 是否裁剪超出坐标系部分的图形，具体裁剪效果根据系列决定：
		/// 散点图：忽略中心点超出坐标系的图形，但是不裁剪单个图形
		/// 柱状图：裁掉所有超出坐标系的部分，但是依然保留柱子的宽度
		/// 折线图：裁掉所有超出坐标系的折线部分，拐点图形的逻辑按照散点图处理
		/// 路径图：裁掉所有超出坐标系的部分
		/// 自定义系列：裁掉所有超出坐标系的部分
		/// 除了自定义系列，其它系列的默认值都为 true，及开启裁剪，如果你觉得不想要裁剪的话，可以设置成 false 关闭。
		/// </summary>
		public Boolean clip { get; set; } = true;

		/// <summary>
		/// number
		/// 柱状图所有图形的 zlevel 值。
		/// zlevel用于 Canvas 分层，不同zlevel值的图形会放置在不同的 Canvas 中，Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
		/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
		/// </summary>
		public int zlevel { get; set; } = 0;

		/// <summary>
		/// number
		/// 柱状图组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
		/// z相比zlevel优先级更低，而且不会创建新的 Canvas。
		/// </summary>
		public int z { get; set; } = 2;

		/// <summary>
		/// boolean
		/// 图形是否不响应和触发鼠标事件，默认为 false，即响应和触发鼠标事件。
		/// </summary>
		public Boolean silent { get; set; } = false;

		/// <summary>
		/// boolean
		/// 是否开启动画。
		/// </summary>
		public Boolean animation { get; set; } = true;

		/// <summary>
		/// number
		/// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
		/// </summary>
		public int animationThreshold { get; set; } = 2000;

		/// <summary>
		/// number
		/// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果：
		/// animationDuration: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public int animationDuration { get; set; } = 1000;

		/// <summary>
		/// string
		/// 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
		/// </summary>
		public String animationEasing { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
		/// 如下示例：
		/// animationDelay: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelay { get; set; } = 0;

		/// <summary>
		/// number,Function
		/// 数据更新动画的时长。
		/// 支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果：
		/// animationDurationUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public dynamic animationDurationUpdate { get; set; } = 300;

		/// <summary>
		/// string
		/// 数据更新动画的缓动效果。
		/// </summary>
		public String animationEasingUpdate { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
		/// 如下示例：
		/// animationDelayUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelayUpdate { get; set; } = 0;

		/// <summary>
		/// *
		/// 本系列特定的 tooltip 设定。
		/// </summary>
		public WUDI.ECharts.Series.Bar.Tooltip.Tooltip tooltip { get; set; }

	}
}
